package cn.tedu.tickets;
/*需求:设计多线程模型,4个售票窗口共计100张
* 本方案使用多线程编程实现方案1:继承thread类的方式来完成*/
public class TestThread {
    public static void main(String[] args) {
        TicketTgread t1 = new TicketTgread("窗口1");
        TicketTgread t2 = new TicketTgread("窗口2");
        TicketTgread t3 = new TicketTgread("窗口3");
        TicketTgread t4 = new TicketTgread("窗口4");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
class TicketTgread extends Thread{
    //定义成员变量,用来保存票数
    /*问题:4个线程对象共计售票400张,原因是创建了4个本类的对象,各自操作各自的成员变量
    * 解决:让所有对象共享同一个变量,这个变量需要设置为静态*/
     static int tickets=100;

    /*添加本类的含参构造,用于给线程对象起名字
    * 由于只添加了这一个含参构造.默认的无参构造被覆盖掉了*/
    public TicketTgread(String name) {
        /*表示调用父类的含参构造,因为实际上起名的功能是父类完成的
        * 所以我们需要将本构造函数接到的名字参数,传给父类的构造函数,让父类起名*/
        super(name);
    }

    @Override
    public void run() {

        //循环卖票
        while (true){
            /*让每个线程经历休眠,增加线程状态切换的频率与出错的概率,产生了问题:
            * 问题1:产生了重卖的现象:同一张票卖给了多个人
            * 问题2:产生了超卖的现象:超出了规定的票数,出现了0 -1 -2这样的票*/
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(getName()+"="+tickets--);
            if (tickets<=0) break;//注意,死循环必须设置出口
            //如果if的{}里的语句只有一句,大括号可以省略不写

        }
    }
}
